package io.gitee.yxsnake.framework.core.convert;

import com.fasterxml.jackson.core.type.TypeReference;
import io.gitee.yxsnake.framework.core.utils.JsonUtils;

import java.io.Serializable;
import java.lang.reflect.Type;
import java.util.List;

/**
 * @author snake
 * @description
 * @since 2024/11/19 0:29
 */
public interface Convert extends Serializable {

    /**
     * 对象转换
     * @param source
     * @param clazz
     * @return
     * @param <T>
     */
    static  <T> T convertObj(Object source,Class<T> clazz) {
        return JsonUtils.parseObject(JsonUtils.toJsonString(source),clazz);
    }

    /**
     * 集合对象转换
     * @param source
     * @param clazz
     * @return
     * @param <T>
     */
    static  <T> List<T> convertObjList(Object source, Class<T> clazz) {
        return JsonUtils.parseArray(JsonUtils.toJsonString(source),clazz);
    }


    /**
     * 获取自动转换后的JavaBean对象
     * @param clazz  目标类型
     * @return T
     */
    default <T> T convert(Class<T> clazz) {
        return JsonUtils.parseObject(JsonUtils.toJsonString(this),clazz);
    }

    /**
     * 复杂类型转换
     *
     * @param clazz  目标类型
     * @return T
     */
    default <T> T convertTypeReference(Class<T> clazz) {
        return JsonUtils.parseObject(JsonUtils.toJsonString(this), new TypeReference<T>() {
            @Override
            public Type getType() {
                return clazz.getGenericSuperclass();
            }
        });
    }
}
